var express = require('express');
var app = express();
//app.use(express.static('.'));     // 配置nginx获取静态文件,就不需要用express.static()了.

var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({     // parse application/x-www-form-urlencoded. 前端的$.post()会设置request的Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    extended: false,                // 默认true.官网建议设置为false:用querystring库解析经过URL-encoded的request body,比如会把'foo=bar&abc=x&abc=1'解析为req.body={foo:'bar',abc:['x','1']}
    limit: '16mb'                   // 默认:'100kb'.files表的content列是mediumtext,最大16MB
//    parameterLimit:1000           // 默认:1000,表示request body的参数个数不能超过1000个
}));
//app.use(bodyParser.json());       // parse application/json.

var pbkb = require('./nodejs/pbkb_node.js');     // 创建新库/新应用时,第4步,修改此处(1/2)
//app.use(pbkb.log_url);

app.post('/login',pbkb.login);
app.get('/usersinfo',pbkb.usersinfo);
app.get('/groupsinfo',pbkb.groupsinfo);
app.post('/useradd',pbkb.useradd);
app.post('/userdel',pbkb.userdel);
app.post('/change_username',pbkb.change_username);
app.post('/userquery',pbkb.userquery);
app.post('/password_reset',pbkb.password_reset);
app.post('/groupadd',pbkb.groupadd);
app.post('/groupdel',pbkb.groupdel);
app.post('/change_groupname',pbkb.change_groupname);
app.post('/groupquery',pbkb.groupquery);
app.post('/group_add_mem',pbkb.group_add_mem);
app.post('/group_del_mem',pbkb.group_del_mem);
app.post('/get_files',pbkb.get_files);
app.post('/mkdir',pbkb.mkdir);
app.post('/mkfile_pre',pbkb.mkfile_pre);    // prepare to mkfile
app.post('/mkfile',pbkb.mkfile);
app.post('/button_editfile',pbkb.button_editfile);
app.post('/editfile_pre',pbkb.editfile_pre);
app.post('/editfile',pbkb.editfile);
app.post('/button_delfile',pbkb.button_delfile);
app.post('/save_editor_content',pbkb.save_editor_content);
app.post('/del_editor_content',pbkb.del_editor_content);
app.post('/del_cfile',pbkb.del_cfile);
app.post('/movedir',pbkb.movedir);
app.post('/re_name',pbkb.re_name);
app.post('/toggle_top',pbkb.toggle_top);
app.post('/toggle_pri',pbkb.toggle_pri);
app.get('/get_groups',pbkb.get_groups);
app.post('/get_group_id',pbkb.get_group_id);
app.post('/change_group_OK',pbkb.change_group_OK);
app.post('/get_full_path',pbkb.get_full_path);
app.post('/get_filename',pbkb.get_filename);
app.post('/editor_upload',pbkb.upload.single('imgFile'), pbkb.editor_upload);
app.post('/search_all_filename',pbkb.search_all_filename);    // 也许"搜索全部目录"比"搜索当前目录"更节约资源
app.post('/search_cur_filename',pbkb.search_cur_filename);
app.post('/search_all_content',pbkb.search_all_content);
app.post('/search_cur_content',pbkb.search_cur_content);
app.post('/del_cookie',pbkb.del_cookie);
app.post('/recover_tmp',pbkb.recover_tmp);

var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.post('/check_cookie',pbkb.check_cookie);

app.listen(8888,'127.0.0.1',()=>{                       // 创建新库/新应用时,第4步,修改此处的监听端口(2/2)
    console.log(pbkb.get_date() + ' listening on 127.0.0.1:8888')
});

process.on('beforeExit', (code) => {        // 当 Node.js 清空其事件循环并且没有其他工作要安排时，会触发 'beforeExit' 事件。
    console.log(pbkb.get_date() + ' 进程 beforeExit 事件的代码: '+code);
});

process.on('exit', (code) => {              // kill -9 和 kill -15 都不会触发 exit 事件; 执行process.exit(code)会触发exit事件
    console.log(pbkb.get_date() + ' 进程 exit 事件的代码: '+code);
});

process.on('warning', (warning) => {        // 一旦探测到可能导致应用性能问题，缺陷或安全隐患相关的代码，Node.js 就可发出告警。
    console.warn(pbkb.get_date() + ' warning.name: ' + warning.name);   // 打印告警名称
    console.warn('warning.message: ' + warning.message);      // 打印告警信息
    console.warn('warning.stack: ' + warning.stack);          // 打印堆栈信息
});

// kill -2      // Ctrl + c 触发 SIGINT,所有系统都支持,将用 回调函数 代替默认的动作
process.on('SIGINT', ()=>{
    console.log(pbkb.get_date() + ` 收到 SIGINT 信号`);
});
// kill -15     // win系统不支持 SIGTERM. 非win系统将用 回调函数 代替默认的动作
process.on('SIGTERM', ()=>{
    console.log(pbkb.get_date() + ` 收到 SIGTERM 信号. 开始关闭mariadb连接池...`);
    pbkb.pool.end().then(()=>{
    console.log(pbkb.get_date()+' 优雅地关闭了mariadb连接池,请确认数据库中是否仍有SQL语句在执行')}).catch(err=>{
        console.log(pbkb.get_date()+` 关闭mariadb连接池时出错,可能连接池已被关闭.错误信息: ${err}`)});
//process.exit();   // 不执行process.exit(),则收到SIGTERM信号时,node程序不退出.
});
// kill -1      // win系统于10秒后无条件关闭进程. 非win系统将用 回调函数 代替默认的动作
process.on('SIGHUP', ()=>{
    console.log(pbkb.get_date() + ` 收到 SIGHUP 信号,不予理会,继续运行 node 进程`);
});
